package com.zhupf.stack;

import java.util.Deque;
import java.util.LinkedList;

/**
 * @author zhupf
 * @date 2024年12月16日 10:14
 * @Description https://leetcode.cn/problems/remove-k-digits/description/
 * 402. 移掉 K 位数字
 * 给你一个以字符串表示的非负整数 num 和一个整数 k ，移除这个数中的 k 位数字，使得剩下的数字最小。请你以字符串形式返回这个最小的数字。
 * <p>
 * 示例 1 ：
 * <p>
 * 输入：num = "1432219", k = 3
 * 输出："1219"
 * 解释：移除掉三个数字 4, 3, 和 2 形成一个新的最小的数字 1219 。
 * 示例 2 ：
 * <p>
 * 输入：num = "10200", k = 1
 * 输出："200"
 * 解释：移掉首位的 1 剩下的数字为 200. 注意输出不能有任何前导零。
 * 示例 3 ：
 * <p>
 * 输入：num = "10", k = 2
 * 输出："0"
 * 解释：从原数字移除所有的数字，剩余为空就是 0 。
 */
public class RemoveKdigits {

    public static void main(String[] args) {
        System.out.println(removeKdigits("10200", 1));

    }


    public static String removeKdigits(String num, int k) {
        if (num.length() == k) {
            return "0";
        }
        Deque<Integer> deque = new LinkedList<>();
        int size = num.length() - k;
        for (int i = 0; i < num.length(); i++) {
            while (!deque.isEmpty() && k > 0 && num.charAt(deque.peek()) > num.charAt(i)) {
                deque.pop();
                k--;
            }
            deque.push(i);
        }
        StringBuffer sb = new StringBuffer();
        while (size > 0) {
            Integer integer = deque.pollLast();
            if (num.charAt(integer) != '0' || sb.length() != 0) {
                sb.append(num.charAt(integer));
            }
            size--;
        }
        return sb.length() == 0 ? "0" : sb.toString();
    }

}
